Portovani dotazu na hodnotu generatoru z IB na MSSQL

Otázka od: Petr Fejfar

16. 10. 2002 18:26

Hi all,


zkousim prenest aplikaci z IB pod MSSQL a potreboval bych nejaky jednoduchy
ekvivalent dotazu:


  select gen_id(mygenerator, 1) from rdb$database


Myslim, ze nejbliz k tomu ma pouziti funkce SCOPE_IDENTITY().

Pls, muze mi nekdo poradit, jak se to na
MSSQL dela? Chtel bych, aby to pokud mozno nebylo
prilis zavisle na konkretni verzi MSSQL.


Thx, pf

Odpovedá: Lstiburek Pavel

17. 10. 2002 9:14

Obavam se, ze zadny primy ekvivalent neni mozny.
Pokud jde o zpusob jak ziskat jednoznacne cislo z nejake rady, tak pouze
pomoci SP. Funkce nelze pouzit, nebot nesmeji mit sideeffect.
Tedy napr.
 1. pro kazdy generator vytvorit tabulku o jednom sloupci typu identity,
 2. v transakci vlozit zaznam,
 3. precit jeho hodnotu,
 4. ulozit do parametru nebo vyselektovat,
 5. smazat (,aby tabulka zbytecně nerostla),
 6. ukomcit transakci.

Fce SCOPE_IDENTITY vraci posledni vlozenou hodnotu do libovolneho sloupce
typu identity v danemo scope (neco jako urovni volani), nikam ale nic
nevklada. Je to minula hodnota a zmenini se az po nejakem inzertu v danem
pripojeni (ostatni ignoruje). Navic byla implementovana az v MSSQL 2000.

Lepsim trikem je pouzit hodnotu CURRENT_TIMESTAMP, ktera se trvale meni, a
lze ji konvertovat na binary(8) - SELECT CURRENT_TIMESTAMP.
Napr.: SELECT CAST( CAST( CURRENT_TIMESTAMP AS BINARY(8)) AS bigint)

Pavel


> Od: Petr Fejfar [mailto:development@callnet.cz]
> zkousim prenest aplikaci z IB pod MSSQL a potreboval bych
> nejaky jednoduchy
> ekvivalent dotazu:
>
>
> select gen_id(mygenerator, 1) from rdb$database
>
>
> Myslim, ze nejbliz k tomu ma pouziti funkce SCOPE_IDENTITY().
>
> Pls, muze mi nekdo poradit, jak se to na
> MSSQL dela? Chtel bych, aby to pokud mozno nebylo
> prilis zavisle na konkretni verzi MSSQL.

Odpovedá: Petr Fejfar

17. 10. 2002 10:04

From: "Lstiburek Pavel" <Lstiburek@ceb.cz>

> nikam ale nic nevklada. Je to minula hodnota
> a zmenini se az po nejakem inzertu v danem
> pripojeni (ostatni ignoruje).

To bylo mysleno tak, ze na MSSQL vlozim nejprve
zaznam do primarni tabulky a pak si prectu hodnotu
pomoci SCOPE_IDENTITY (kdyz mi nic jineho nezbyde  

> Navic byla implementovana az v MSSQL 2000.

Hm, to je docela zavazne omezeni. Takze pak by se
dala v urcitych pripadech pouzit jen @@IDENTITY.
BTW, da se nejak (napr. v BOL k MSSQL 2000) zjistit,
ze dana funkce neni podporovana starsimi servery?


Bye, pf


Odpovedá: Lstiburek Pavel

17. 10. 2002 11:42

Tak to samozrejme lze.
Jak je to novymi vlastnostmi nevim presne, ja jsem tuto fci nasel v popis k
verzi 2000 jako velkou vyhodu (a to fakt je !).
Pozor na @@IDENTITY a trigery, protoze vraci posledni vlozenou hodnotu bez
ohledu na uroven (tedy i hodnotu vlozenou triggrem !).
Pavel

> Od: Petr Fejfar [mailto:development@callnet.cz]
> > nikam ale nic nevklada. Je to minula hodnota
> > a zmenini se az po nejakem inzertu v danem
> > pripojeni (ostatni ignoruje).
>
> To bylo mysleno tak, ze na MSSQL vlozim nejprve
> zaznam do primarni tabulky a pak si prectu hodnotu
> pomoci SCOPE_IDENTITY (kdyz mi nic jineho nezbyde  
>
> > Navic byla implementovana az v MSSQL 2000.
>
> Hm, to je docela zavazne omezeni. Takze pak by se
> dala v urcitych pripadech pouzit jen @@IDENTITY.
> BTW, da se nejak (napr. v BOL k MSSQL 2000) zjistit,
> ze dana funkce neni podporovana starsimi servery?
>
>
> Bye, pf
>
>
>